package cn.liangxxhu.gateway.factory;

import cn.liangxxhu.gateway.handler.DebugMethodInterceptor;
import net.sf.cglib.proxy.Enhancer;

/**
 * CGLIB 动态代理工厂类
 * 负责为目标类生成基于「类继承」的动态代理对象，解决 JDK 动态代理需依赖接口的局限性
 * 核心原理：通过 CGLIB 的 Enhancer 生成目标类的子类，重写目标方法并植入增强逻辑（由 DebugMethodInterceptor 实现）
 * 注意：被代理的目标类不能是 final 修饰（子类无法继承 final 类），目标类中的 final 方法也无法被拦截增强
 */
public class CglibProxyFactory {

    /**
     * 创建目标类的 CGLIB 动态代理对象
     * @param clazz 被代理的目标类的 Class 对象（如 UserServiceImpl.class），需非 final 类
     * @return 生成的代理对象（类型为目标类的子类，可直接强转为目标类类型使用）
     */
    public static Object getProxy(Class<?> clazz) {
        // 1. 创建 CGLIB 核心增强器（Enhancer）：用于生成目标类的子类（代理类）
        Enhancer enhancer = new Enhancer();

        // 2. 设置代理类的类加载器：与目标类使用同一类加载器，确保类加载一致性
        enhancer.setClassLoader(clazz.getClassLoader());

        // 3. 设置代理类的父类（即被代理的目标类）：CGLIB 通过继承实现代理
        enhancer.setSuperclass(clazz);

        // 4. 设置方法拦截器：代理类的方法被调用时，会回调 DebugMethodInterceptor 的 intercept 方法执行增强逻辑
        enhancer.setCallback(new DebugMethodInterceptor());

        // 5. 生成并返回代理对象：内部会动态生成目标类的子类字节码，加载后实例化
        return enhancer.create();
    }
}